package com.example.lambda;

import com.example.actionParam.Apple;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function;

/**
 * Created by butterfly on 2018/7/2.
 */
public class FunctionDemo {

    public static void main(String[] args) {
        //把string类型的list转成int类型的list。Function中的 R apply(T t)
        List<Integer> result = mapTo(Arrays.asList("元素1", "元素2", "元素3"), (str -> str.length()));
        //如果lambda表达式中只是参数对某个方法的简单调用，可以写成方法引用形式
        List<Integer> result2 = mapTo(Arrays.asList("元素1", "元素2", "元素3"), (String::length));
        int i  = 0;
        Apple white = new Apple("white", 12);
        Runnable r = () -> {
//            white = new Apple("green",13);
//            i++;
            System.out.println(i);
        };
//        i++;被lambda表达式捕获的局部变量必须是final的，否则将会编译报错
    }

    /**
     * 用于把list里的元素映射成另一种类型
     * @param list 原集合
     * @param f 工具类
     * @param <T> 类型一
     * @param <R> 类型二 (目标元素类型)
     * @return
     */
    public static <T,R> List<R> mapTo(List<T> list, Function<T,R> f){
        if (list == null || list.size() == 0){
            return null;
        }
        List<R> result = new ArrayList<R>();
        for (T t : list) {
            R r = f.apply(t);
            result.add(r);
        }
        return result;
    }
}
